001 /**
002 * Created by IntelliJ IDEA.
003 * User: Wei Wang
004 * Date: Feb 27, 2003
005 * Time: 1:52:09 PM
006 */
007
008 package EVolve.visualization;
009
010 import EVolve.util.painters.shapes.*;
011 import EVolve.util.painters.shapes.Shape;
012 import EVolve.exceptions.NoDataPlotException;
013
014 import java.awt.*;
015 import java.awt.image.BufferedImage;
016 import java.util.*;
017
018 public class AutoShapeImage extends AutoImage{
019 private Shape defaultShape;
020
021 public AutoShapeImage() {
022 w = h = 0;
023 wMax = hMax = 200;
024 image = new short[wMax][hMax];
025 for (int i = 0; i < wMax; i++) {
026 for (int j = 0; j < hMax; j++) {
027 image[i][j] = 0;
028 }
029 }
030 defaultShape = null;
031 }
032
033 public AutoShapeImage(Shape defaultShape) {
034 this();
035 this.defaultShape = defaultShape;
036 }
037
038 private void drawShapes(Graphics2D g2, int x, int y) {
039 if (defaultShape == null) {
040 ArrayList value = (ArrayList)Int2Object.get(new Integer(image[x][y]));
041 for (int k=0; k<value.size(); k++)
042 ((Shape)value.get(k)).draw(g2);
043 } else { //when there is active default shape, image array contains color
044 int width = defaultShape.getWidth(), height = defaultShape.getHeight();
045 defaultShape.setColor((Color)Int2Object.get(new Integer(image[x][y])));
046 defaultShape.move(x*width,y*height);
047 defaultShape.draw(g2);
048 defaultShape.fill(g2);
049 }
050 }
051
052 public void setColor(int x, int y, Object shape) {
053
054 if ((x >= wMax) || (y >= hMax)) {
055 while (x >= wMax) {
056 wMax += 200;
057 }
058 while (y >= hMax) {
059 hMax += 200;
060 }
061
062 short[][] newImage = new short[wMax][hMax];
063 for (int i = 0; i < wMax; i++) {
064 for (int j = 0; j < hMax; j++) {
065 newImage[i][j] = 0;
066 }
067 }
068 for (int i = 0; i < w; i++) {
069 for (int j = 0; j < h; j++) {
070 newImage[i][j] = image[i][j];
071 }
072 }
073 image = newImage;
074 }
075
076 if (defaultShape == null) {
077 Shape aShape = (Shape)shape;
078 if (image[x][y] == 0) {
079 short size = (short)object2Int.size();
080 ArrayList value = new ArrayList();
081 object2Int.put(value, new Integer(size));
082 Int2Object.put(new Integer(size),value);
083 image[x][y] = size;
084 }
085 ((ArrayList)Int2Object.get(new Integer(image[x][y]))).add(aShape);
086 } else {
087 if (object2Int.containsKey(shape)) {
088 image[x][y] = ((Integer)object2Int.get(shape)).shortValue(); //in this case, shape contains a color object
089 } else {
090 short size = (short)object2Int.size();
091 object2Int.put(shape,new Integer(size));
092 Int2Object.put(new Integer(size),shape);
093 image[x][y] = size;
094 }
095 }
096
097 if (x >= w) {
098 w = x + 1;
099 }
100 if (y >= h) {
101 h = y + 1;
102 }
103 }
104
105 public BufferedImage getImage() throws NoDataPlotException{
106 BufferedImage returnVal = null;
107
108 if (defaultShape != null) {
109 imageWidth = defaultShape.getWidth() * w;
110 imageHeight = defaultShape.getHeight() * h;
111 }
112
113 if (imageWidth*imageHeight == 0) throw new NoDataPlotException();
114
115 returnVal = new BufferedImage(imageWidth, imageHeight,BufferedImage.TYPE_INT_RGB);
116 returnVal.getGraphics().setColor(Color.white);
117 returnVal.getGraphics().fillRect(0, 0, imageWidth, imageHeight);
118 Graphics2D g2 = (Graphics2D)returnVal.getGraphics();
119
120 for (int i = 0; i < w; i++) {
121 for (int j = 0; j < h; j++) {
122 if (image[i][j] != 0)
123 drawShapes(g2,i,j);
124 }
125 }
126
127 return returnVal;
128 }
129
130 public Object getColor(int x, int y) {
131 if (((image!=null) && ((x < 0) || (y < 0) || (x >= image.length) || (y >= image[0].length))) ||(image[x][y]==0)) {
132 return null;
133 } else {
134 if (defaultShape == null)
135 return Int2Object.get(new Integer(image[x][y]));
136 else
137 return (Color)Int2Object.get(new Integer(image[x][y]));
138 }
139 }
140
141 public Color getSortedColor(ReferenceDimension xAxis, ReferenceDimension yAxis,int x,int y) {
142 int xMappedId, yMappedId;
143 xMappedId = (xAxis == null) ? x : xAxis.getOriginMappedId(x);
144 yMappedId = (yAxis == null) ? y : yAxis.getOriginMappedId(y);
145
146 if ((xMappedId >= wMax) || (yMappedId >= hMax) || (xMappedId < 0) || (yMappedId < 0))
147 return null;
148 else
149 if (defaultShape == null)
150 return ((Shape)((ArrayList)Int2Object.get(new Integer(image[xMappedId][yMappedId]))).get(0)).getColor();
151 else
152 return (Color)Int2Object.get(new Integer(image[x][y]));
153 }
154
155 public Shape getEntityShapes(int x,int y) {
156 for (int i=0; i<w; i++) {
157 for (int j=0; j<h; j++) {
158 ArrayList data = (ArrayList)Int2Object.get(new Integer(image[i][j]));
159 if (data != null) {
160 for (int k=0; k<data.size(); k++) {
161 Shape aShape = (Shape)data.get(k);
162 if (aShape.insideShape(x,y)) return aShape;
163 }
164 }
165 }
166 }
167 return null;
168 }
169
170 public AutoImage getSortedImage(ReferenceDimension xAxis, ReferenceDimension yAxis) {
171 AutoShapeImage returnVal = new AutoShapeImage(defaultShape);
172 for (int i = 0; i < w; i++) {
173 for (int j = 0; j < h; j++) {
174 int x, y;
175 if (xAxis == null) {
176 x = i;
177 } else {
178 x = xAxis.getSortedIndex(i);
179 }
180 if (yAxis == null) {
181 y = j;
182 } else {
183 y = yAxis.getSortedIndex(j);
184 }
185 if ((x != -1) && (y != -1) && (image[i][j]!=0)) {
186 if (defaultShape == null) {
187 ArrayList value = (ArrayList)Int2Object.get(new Integer(image[i][j]));
188 for (int k=0; k< value.size(); k++) {
189 Shape aShape = (Shape)(value.get(k));
190 returnVal.setColor(x, y, aShape);
191 }
192 } else {
193 returnVal.setColor(x,y,Int2Object.get(new Integer(image[i][j])));
194 }
195 }
196 }
197 }
198 returnVal.setImageWidth(imageWidth,imageHeight);
199 return returnVal;
200 }
201
202 public void setImageWidth(int width, int height) {
203 imageWidth = width;
204 imageHeight = height;
205 }
206
207 public void reArrange(int width, int boxSize) {
208 int newWidth = width/boxSize;
209 int newHeight = ((w*h)%newWidth == 0) ? w*h/newWidth : w*h/newWidth + 1;
210 short newImage[][] = new short[newWidth][newHeight];
211 for (int i=0; i<w*h; i++) {
212 newImage[i%newWidth][i/newWidth] = image[i%w][i/w];
213 }
214
215 w = newWidth;
216 h = newHeight;
217 image = null;
218 image = newImage;
219 defaultShape.setSize(boxSize, boxSize);
220 }
221
222 public Object clone() {
223 AutoShapeImage o = new AutoShapeImage();
224
225 o.image = new short[wMax][hMax];
226 o.imageWidth = imageWidth;
227 o.imageHeight = imageHeight;
228 o.Int2Object = new HashMap();
229 o.object2Int = new HashMap();
230 o.w = w;
231 o.h = h;
232 o.wMax = wMax;
233 o.hMax = hMax;
234
235 if (defaultShape == null) {
236 o.object2Int.put(null,new Integer(0));
237 o.Int2Object.put(new Integer(0),null);
238 for (int i=0; i<image.length; i++) {
239 for (int j=0; j<image[i].length; j++) {
240 o.image[i][j] = image[i][j];
241 if (image[i][j] != 0) {
242 ArrayList value = (ArrayList)Int2Object.get(new Integer(image[i][j]));
243 ArrayList newValue = new ArrayList();
244 o.Int2Object.put(new Integer(image[i][j]),newValue);
245 o.object2Int.put(newValue, new Integer(image[i][j]));
246 for (int k=0; k<value.size(); k++) {
247 newValue.add(((Shape)value.get(k)).clone());
248 }
249 } else
250 o.image[i][j] = 0;
251 }
252 }
253 } else {
254 o.defaultShape = (Shape)defaultShape.clone();
255 for (int i=0; i<image.length; i++) {
256 for (int j=0; j<image[i].length; j++)
257 o.image[i][j] = image[i][j];
258 }
259
260 Iterator it = object2Int.keySet().iterator();
261 while (it.hasNext()) {
262 Object key = it.next();
263 o.object2Int.put(key, object2Int.get(key));
264 }
265 it = Int2Object.keySet().iterator();
266 while (it.hasNext()) {
267 Object key = it.next();
268 o.Int2Object.put(key, Int2Object.get(key));
269 }
270 }
271
272 return o;
273 }
274 }